#===istalismanplugin===
# -*- coding: utf-8 -*-

# $Revision: 54 $
# $Author: rchiganov@gmail.com $
# $Date: 2013-08-05 07:16:38 +0000 (Mon, 05 Aug 2013) $

#---------------------------------------------------------------------------------------------------

# Выводим список доступных команд, разделённых по уровням доступа
def command_comlist ( ptype, psource, pparameters ):
	lparam = pparameters.split()
	if len(lparam) != 0:
		reply(ptype, psource, u'что то ты не то пишешь *SCRATCH*')
		return

	llistacc = {
		  0 : u'Никто',
		 10 : u'Участник',
		 11 : u'Мембер',
		 15 : u'Модератор',
		 16 : u'Модератор',
		 20 : u'Администратор',
		 30 : u'Владелец',
		 80 : u'Админ бота',
		100 : u'Владелец бота'
	}

	ldate = time.strftime('%d %b %Y (%a)', time.gmtime()).decode('utf-8')
	lanswer = u'\nСписок доступных команд по правам доступа на ' + ldate + u':\n'
	laccess = user_level(psource[1] + '/' + psource[2], psource[1])
	llevels, lcommands, lmaccess = {}, {}, {}

	for lcommand in COMMANDS.keys():
		lcommands[lcommand] = COMMANDS[lcommand]['access']

	lmaccess = MACROS.gaccesslist
	for lcommand in MACROS.gmacrolist.keys():
		if not lcommands.has_key(lcommand):
			if lmaccess.has_key(lcommand):
				lcommands[lcommand] = int(lmaccess[lcommand])
			else:
				lcommands[lcommand] = 10
		else:
			if lmaccess.has_key(lcommand):
				lcommands[lcommand] = int(lmaccess[lcommand])

	if MACROS.accesslist.has_key(psource[1]):
		lmaccess = MACROS.accesslist[psource[1]]
	else:
		lmaccess = {}

	if MACROS.macrolist.has_key(psource[1]):
		for lcommand in MACROS.macrolist[psource[1]].keys():
			if not lcommands.has_key(lcommand):
				if lmaccess.has_key(lcommand):
					lcommands[lcommand] = int(lmaccess[lcommand])
				else:
					lcommands[lcommand] = 20
			else:
				if lmaccess.has_key(lcommand):
					lcommands[lcommand] = int(lmaccess[lcommand])

	lcommoff = []
	if COMMOFF.has_key(psource[1]):
		lcommoff = COMMOFF[psource[1]]

	for lcommand in lcommands.keys():
		if lcommands[lcommand] <= laccess and lcommand not in lcommoff:
			if not llevels.has_key(lcommands[lcommand]):
				llevels[lcommands[lcommand]] = []
			llevels[lcommands[lcommand]].append(lcommand)

	for litem in sorted(llevels.keys(), reverse=True):
		lanswer += u'\n## Команды для пользователей с доступом %d (%s):\n' % (litem, llistacc.get(litem, u'Unknown'))
		lanswer += u', '.join(sorted(llevels[litem])) + u'\n'

	if len(lcommoff) != 0:
		lanswer += u'\n## Команды, которые отключены в этой конференции:\n'
		lanswer += u', '.join(sorted(COMMOFF[psource[1]])) + u'\n'

	if ptype == 'public':
		reply(ptype, psource, 'в привате')
	lanswer += u'\nВам доступны команды уровня %d (%s) и ниже' % (laccess, llistacc.get(laccess, u'Unknown'))
	reply('private', psource, lanswer)

#---------------------------------------------------------------------------------------------------

# Выводим список команд, разделённых по категориям
def command_comcat ( ptype, psource, pparameters ):
	lparam = pparameters.split()
	if len(lparam) != 0:
		reply(ptype, psource, u'что то ты не то пишеш *SCRATCH*')
		return

	ldate = time.strftime('%d %b %Y (%a)', time.gmtime()).decode('utf-8')
	lanswer  = u'\nСписок команд по категориям на ' + ldate + u':\n'

	lcommoff = []
	if COMMOFF.has_key(psource[1]):
		lcommoff = COMMOFF[psource[1]]

	# Добавляем список команд
	lcatlist = {}
	for lcommand in COMMANDS.keys():
		if lcommand not in lcommoff:
			for lcat in COMMANDS[lcommand]['category']:
				if not lcatlist.has_key(lcat):
					lcatlist[lcat] = []
				lcatlist[lcat].append(lcommand)
	for lcat in sorted(lcatlist.keys()):
		lanswer += u'\n## Команды, входящие в категорию "%s":\n' % lcat.decode('utf-8')
		lanswer += u', '.join(sorted(lcatlist[lcat])) + u'\n'

	# Добавляем список макросов
	lcatlist = { 'макросы': [] }
	if len(MACROS.gmacrolist.keys()) != 0:
		for lcommand in MACROS.gmacrolist.keys():
			if lcommand not in lcommoff:
				lcatlist['макросы'].append(lcommand)
	if MACROS.macrolist.has_key(psource[1]):
		for lcommand in MACROS.macrolist[psource[1]].keys():
			if lcommand not in lcommoff and lcommand not in lcatlist['макросы']:
				lcatlist['макросы'].append(lcommand)
	for lcat in lcatlist.keys():
		lanswer += u'\n## Команды, входящие в категорию "%s":\n' % lcat.decode('utf-8')
		lanswer += u', '.join(sorted(lcatlist[lcat])) + u'\n'

	if len(lcommoff) != 0:
		lanswer += u'\n## Команды, которые отключены в этой конференции:\n'
		lanswer += u', '.join(sorted(COMMOFF[psource[1]])) + u'\n'

	if ptype == 'public':
		reply(ptype, psource, 'в привате')
	reply('private', psource, lanswer)

#---------------------------------------------------------------------------------------------------

def command_commands ( ptype, psource, pparameters ):
	lparam = pparameters.split()
	if len(lparam) > 1:
		reply(ptype, psource, u'что то ты не то пишешь... лучше почитай хелп по команде...')
		return

	ldate = time.strftime('%d %b %Y (%a)', time.gmtime()).decode('utf-8')
	lcategory = { u'макросы': { 'common': [], 'commoff': [] } }

	lcommoff = []
	if COMMOFF.has_key(psource[1]):
		lcommoff = COMMOFF[psource[1]]

	for lcommand in COMMANDS.keys():
		for lcat in COMMANDS[lcommand]['category']:
			if lcat.decode('utf-8') not in lcategory.keys():
				lcategory[lcat.decode('utf-8')] = { 'common': [], 'commoff': [] }
			if lcommand in lcommoff:
				lcategory[lcat.decode('utf-8')]['commoff'].append(lcommand)
			else:
				lcategory[lcat.decode('utf-8')]['common'].append(lcommand)

	if len(lparam) == 0:
		if ptype == 'public':
			reply(ptype, psource, u'ушли')
		reply('private', psource, u'\nСписок категорий на ' + ldate + u':\n' + u', '.join(sorted(lcategory.keys())) + u'\n\nДля просмотра списка команд содержащихся в категории наберите "команды <категория>".\nНапример:\n    команды все')

	else:
		if lparam[0] not in lcategory.keys():
			reply(ptype, psource, u'а есть и такая? :-O')
			return

		if lparam[0] == u'макросы':
			for lcommand in MACROS.gmacrolist.keys():
				if lcommand in lcommoff:
					lcategory[u'макросы']['commoff'].append(lcommand)
				else:
					lcategory[u'макросы']['common'].append(lcommand)

			if MACROS.macrolist.has_key(psource[1]):
				for lcommand in MACROS.macrolist[psource[1]].keys():
					if lcommand in lcommoff and lcommand not in lcategory[u'макросы']['commoff']:
						lcategory[u'макросы']['commoff'].append(lcommand)
					elif lcommand not in lcommoff and lcommand not in lcategory[u'макросы']['common']:
						lcategory[u'макросы']['common'].append(lcommand)

		if ptype == 'public':
			reply(ptype, psource, u'ушли')

		lanswer  = u'\nСписок команд в категории "' + lparam[0] + u'" на ' + ldate + u':\n' + u', '.join(sorted(lcategory[lparam[0]]['common']))
		lanswer += u'\n\nСписок отключённых команд в категории "' + lparam[0] + u'" на ' + ldate + u':\n' + u', '.join(sorted(lcategory[lparam[0]]['commoff']))
		reply('private', psource, lanswer)

#---------------------------------------------------------------------------------------------------

register_command_handler(command_comlist, 'комлист', ['хелп', 'инфо', 'все'], 0, 'Показывает список доступных команд по уровням доступа.', 'комлист', ['комлист'])

register_command_handler(command_comcat, 'комкат', ['хелп', 'инфо', 'все'], 0, 'Показывает список доступных команд по категориям.', 'комкат', ['комкат'])

register_command_handler(command_commands, 'команды', ['хелп', 'инфо', 'все'], 0, 'Показывает список всех категорий команд. При запросе категории показывает список команд находящихся в ней.', 'команды [категория]', ['команды','команды все'])

#---------------------------------------------------------------------------------------------------
